package com.lihaozhe.orderservice.client;

import com.lihaozhe.orderservice.config.FeignConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.Map;

/**
 * 商品服务Feign客户端接口
 * <p>
 * Feign的特点：
 * - 声明式调用：只需定义接口，无需实现
 * - 自动服务发现：基于服务名发现实例
 * - 负载均衡：自动集成LoadBalancer
 * - 错误处理：可配置降级逻辑
 * </p>
 * @author 李昊哲
 * @version 1.0.0
 */
@FeignClient(
    name = "product-service",
    path = "/api/products",
    configuration = FeignConfig.class
)
public interface ProductServiceClient {

  /**
   * 根据商品ID获取商品信息
   * 对应 product-service 的 GET /api/products/{id}
   *
   * @param id 商品ID
   * @return 商品信息
   */
  @GetMapping("/{id}")
  Map<String, Object> getProductById(@PathVariable("id") Long id);

  /**
   * 获取所有商品
   * 对应 product-service 的 GET /api/products
   *
   * @return 商品列表
   */
  @GetMapping
  Map<String, Object> getAllProducts();

  /**
   * 根据分类获取商品
   * 对应 product-service 的 GET /api/products/category/{category}
   *
   * @param category 商品分类
   * @return 分类商品列表
   */
  @GetMapping("/category/{category}")
  Map<String, Object> getProductsByCategory(@PathVariable("category") String category);

  /**
   * 更新商品库存
   * 对应 product-service 的 PUT /api/products/{id}/stock
   *
   * @param id      商品ID
   * @param request 库存更新请求
   * @return 更新结果
   */
  @PutMapping("/{id}/stock")
  Map<String, Object> updateStock(
      @PathVariable("id") Long id,
      @RequestBody Map<String, Integer> request
  );

  /**
   * 获取实例信息
   * 对应 product-service 的 GET /api/products/instance-info
   *
   * @return 实例信息
   */
  @GetMapping("/instance-info")
  Map<String, Object> getInstanceInfo();
}
